classDiagram
  class Ancestor {
    attr : str
    cls_member
    get_value()
    set_value(value)
  }
  class CustomException {
  }
  class DoNothing {
  }
  class DoNothing2 {
  }
  class DoSomething {
    my_int : Optional[int]
    my_int_2 : Optional[int]
    my_string : str
    do_it(new_int: int) -> int
  }
  class Interface {
    get_value()
    set_value(value)
  }
  class PropertyPatterns {
    prop1
    prop2
  }
  class Specialization {
    TYPE : str
    relation
    relation2
    top : str
    from_value(value: int)
    increment_value() -> None
    transform_value(value: int) -> int
  }
  Specialization --|> Ancestor
  Ancestor ..|> Interface
  DoNothing --* Ancestor : cls_member
  DoNothing --* Specialization : relation
  DoNothing2 --* Specialization : relation2
